#ifndef CLIENTE_H
#define CLIENTE_H

#include <vector>

using namespace std;

class Cliente {

  private:
    double W1i, W1f;    ///Tempo na fila de espera inicial e final que um cliente demora na fila 1
    double W2i, W2f;    ///Tempo na fila de espera inicial e final que um cliente demora na fila 2
    double X1i, X1f;    ///Tempo de servico inicial e final que um cliente demora na fila 1
    double X2i, X2f;    ///Tempo de servico inicial e final que um cliente demora na fila 2
    vector<double> v_W2i, v_W2f;  ///Vetor que guarda todos os instantes de tempo que o cliente entra e sai da fila de espera
    vector<double> v_X2i, v_X2f;  ///Vetor que guarda todos os instantes de tempo que o cliente entra e sai do servidor
    int Nq1, Nq2;       ///Guarda o numero de clientes na fila no momento que o cliente foi criado
    int N1, N2;         ///Guarda o numero de clientes na fila + servidor quando o cliente foi criado
    int c_rodada;       ///Armazena a rodada em que o cliente chegou


  public:
    /** Construtor */
    Cliente(long int rodada);

    /** Destrutor */
    ~Cliente();

    /** Cliente chega na fila 1 e armazena o tempo de entrada na fila 1*/
    void entraFila1(double tempo);

    /** Cliente da fila 1 entra no servidor, e armazena o tempo de saida na fila 1
       e o tempo de entrada no servidor pela fila 1 */
    void entraServidorFila1(double tempo);

    /** Cliente chega na fila 2, e armazena o tempo de saida no servidor
       e o tempo de entrada na fila 2 */
    void entraFila2(double tempo);

    /** Cliente da fila 2 entra no servidor, e armazena o tempo de saida na fila 2
       e o tempo de entrada no servidor */
    void entraServidorFila2(double tempo);

    /** Cliente que estava no servidor que veio da fila 2, e foi interrompido por um
        cliente da fila 1 (mais prioritaria) */
    void retornaFila2(double tempo);

    /** Cliente foi atendido, eh armazenado o tempo de saida no servidor */
    void saiSistema(double tempo);

    /** Retorna 1 se o cliente esta passando pela primeira vez no servidor
       isto eh, se o cliente saiu da fila 1 e foi para o servidor,
       caso contrario, retorna 2 */
    int pertenceFila();

    /** retorna a rodada */
    int rodada();

    /** Calcula e retorna W1, tempo de espera na fila 1 */
    double calculaW1();

    /** Calcula e retorna W2, tempo de espera na fila 2 */
    double calculaW2();

    /** Calcula e retorna X1, tempo de servico da fila 1 */
    double calculaX1();

    /** Calcula e retorna X2, tempo de servico da fila 2 */
    double calculaX2();

    /** Calcula e retorna T1, tempo de espera e servico da fila 1 */
    double calculaT1();

    /** Calcula e retorna T2, tempo de espera e servico da fila 2 */
    double calculaT2();

    /** Calcula N1, o numero de pessoas na fila 1 + servidor */
    int calculaN1();

    /** Calcula N2, o numero de pessoas na fila 2 + servidor */
    int calculaN2();

    /** Calcula N1, o numero de pessoas na fila 1 */
    int calculaNq1();

    /** Calcula Nq2, o numero de pessoas na fila 2 */
    int calculaNq2();

    /** Recebe como paramentros a quantidade de pessoas na fila e que tipo de cliente esta no servidor (fila 1 ou fila 2) */
    void coletaDadosFila(int tamanhoFila1, int tamanhoFila2, int clienteServidor);

};

#endif // CLIENTE_H
